package com.example.dubboserver.filter;

import org.apache.dubbo.common.constants.CommonConstants;
import org.apache.dubbo.common.extension.Activate;
import org.apache.dubbo.rpc.*;

/**
 * 自定义Dubbo过滤器 - 实现日志记录
 * 
 * Activate注解说明：
 * - group: 可以指定提供者或消费者组
 * - order: 过滤器执行顺序
 */
@Activate(group = {CommonConstants.PROVIDER, CommonConstants.CONSUMER}, order = -10000)
public class DubboLogFilter implements Filter {

    @Override
    public Result invoke(Invoker<?> invoker, Invocation invocation) throws RpcException {
        long startTime = System.currentTimeMillis();
        
        // 记录调用信息
        String serviceName = invoker.getInterface().getSimpleName();
        String methodName = invocation.getMethodName();
        Object[] args = invocation.getArguments();
        
        System.out.printf("[Dubbo] 调用服务：%s，方法：%s，参数：%s%n", 
                serviceName, methodName, java.util.Arrays.toString(args));
        
        try {
            // 执行调用
            Result result = invoker.invoke(invocation);
            
            // 记录执行时间
            long costTime = System.currentTimeMillis() - startTime;
            System.out.printf("[Dubbo] 服务：%s，方法：%s，执行时间：%dms%n", 
                    serviceName, methodName, costTime);
            
            return result;
        } catch (Exception e) {
            // 记录异常
            long costTime = System.currentTimeMillis() - startTime;
            System.out.printf("[Dubbo] 服务：%s，方法：%s，执行时间：%dms，异常：%s%n", 
                    serviceName, methodName, costTime, e.getMessage());
            throw e;
        }
    }
}